home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #045 (1990)(Amiga User Group Deutschland e.V.).zip / Franz PD Disk #045 (1990)(Amiga User Group Deutschland e.V.).adf / Earth-Boing / Earth-Boing.c < prev    next >
C/C++ Source or Header  |  1989-07-02  |  19KB  |  472 lines

  1. /* EARTH-BOING V1.4 ....
  2.  * von Tim Pietzcker Software
  3.  * --------------------------
  4.  * Diese Version fertiggestellt :
  5.  * 29.August 1988
  6.  * Änderungen seit 1.3 :
  7.  * Geschwindigkeitssteigerung beim Füllen
  8.  */
  9.  
  10. #include <intuition/intuition.h>   /* Manager */
  11. #include <graphics/gfxbase.h>      /* Designer */
  12. #include <graphics/gfxmacros.h>    /* Special Effects */
  13. #include <math.h>                  /* Clapper Holder */
  14. #include <exec/types.h>            /* Casting */
  15. #define PI180 0.017453292   /* pi durch 180 */
  16. #ifndef MAXBILDER
  17. #define MAXBILDER 72          /* Anzahl der Einzelbilder für die Animation.
  18.                                  Kann,muß aber nicht beim Compilieren
  19.                                  angegeben werden,und zwar so :
  20.                                     cc -DMAXBILDER=n Earth-Boing
  21.                                  ,wobei für n die gewünschte Anzahl
  22.                                  eingesetzt werden muß.
  23.                                  Mögliche Werte: Teiler von 360.
  24.                                  Sinnvolle Werte : 36 und 72 (bei mehr
  25.                                  dauert das Rechnen zu lange,und es wird
  26.                                  mehr Speicher verbraucht; bei weniger
  27.                                  wird die Animation zu ruckhaft */
  28. #endif
  29.  
  30. struct IntuitionBase *IntuitionBase;   /* als Adresse von Intuition */
  31. struct GfxBase       *GfxBase;         /*  "     "     "  Graphics */
  32. struct Library       *OpenLibrary();   /* ich deklariere die Funktions-
  33.                                           aufrufe,die keinen 16-bit int
  34.                                           zurückgeben,damit ich das
  35.                                           Programm mit 16-bit ints
  36.                                           compilieren kann (sonst Guru !!)*/
  37. struct Window        *MyWindow,*OpenWindow();  /* Zeiger auf Window; s.o. */
  38. struct Window        *mw[2];           /* aufgrund des Double-Buffering
  39.                                           brauche ich zwei Windows während
  40.                                           der Animation */
  41. struct Screen        *ms[2],*OpenScreen();   /* siehe oben */
  42. struct RastPort      *rp[2];           /* s.o. */
  43. struct ViewPort      *vp[2];           /* s.o. */
  44. struct IntuiMessage  *msg,*GetMsg();   /* Zeiger auf Message */
  45. struct BitMap        myBM[MAXBILDER],*MyWindowBM[2]; /* Bitmaps,Pointers */
  46. PLANEPTR             AllocRaster(),myplane;
  47. struct TmpRas        hilfras,*InitTmpRas();
  48.  
  49. struct NewWindow TheWindow =           /* jetzt die Daten für das Window,
  50.                                           in dem die Einzelbilder vorge-
  51.                                           zeichnet werden */
  52. {
  53.    0,0,           /* links oben */
  54.    212,115,          /* Breite,Höhe */
  55.    0,1,              /* Detail-, BlockPen */
  56.    NULL,             /* IDCMP-Flags */
  57.    GIMMEZEROZERO|ACTIVATE,
  58.                      /* Flags */
  59.    NULL,NULL,        /* FirstGadget,CheckMark */
  60.    (UBYTE *)"Please wait a second...", /* Titel */
  61.    NULL,             /* kommt noch */
  62.    NULL,             /* keine selbstgebaute BitMap */
  63.    0,0,0,0,          /* kein Sizing */
  64.    CUSTOMSCREEN,     /* Typ */
  65. };                   /* Semikolon DARF nicht vergessen werden !! */
  66.  
  67. struct NewWindow TheWindow2 =          /* die Animations-Window-Daten */
  68. {
  69.    0,0,
  70.    640,200,
  71.    0,1,
  72.    MOUSEBUTTONS,
  73.    GIMMEZEROZERO,
  74.    NULL,NULL,
  75.    NULL,
  76.    NULL,NULL,
  77.    0,0,0,0,
  78.    CUSTOMSCREEN,
  79. };
  80.  
  81. struct NewScreen TheScreen =           /* für die zwei neuen Screens */
  82. {
  83.    0,0,
  84.    640,200,
  85.    1,0,1,
  86.    HIRES,
  87.    CUSTOMSCREEN,
  88.    NULL,
  89.    (UBYTE *)"                           EARTH-BOING © 1988 by Tim Pietzcker",
  90.    NULL,
  91.    NULL,
  92. };
  93.  
  94. /* jetzt kommt die Initialisierung der globalen Variablen (keine Lust auf
  95.  * call by reference) 
  96.  */
  97.  
  98. double sin(),cos();
  99. int drehung=0,winkel,laenge,breite;
  100. float x,y,z=0,za;
  101. double sn[361],cs[361]; /* Da der Amiga am liebsten so wenig wie möglich
  102.                          * rechnet,berechne ich die sinüsse und cosinüsse
  103.                          * im voraus (siehe weiter unten) */
  104. int datanz[] = { 0,31,37,5,34,20,5,11,5,4,56,3,3,7,4,4,10,117,4,4,4,6,3 };
  105.              /* Anzahl der Punkte,die die Kontinente und Inseln besitzen */
  106.  
  107. /* jetzt kommt der große Brocken - sämtliche Umrißpunktdaten (jeweils als
  108.  * Pärchen - Längengrad und Breitengrad
  109.  */
  110.                /* Südamerika */
  111. int erddat[] ={0,-70,12,-61,10,-56,6,-52,5,-50,0,-40,-4,-36,-6,
  112.                -35,-9,-39,-15,-41,-22,-48,-26,-49,-29,
  113.                -55,-35,-57,-35,-58,-39,-61,-39,-68,-47,
  114.                -66,-48,-70,-51,-63,-55,-70,-56,-75,-53,
  115.                -76,-49,-74,-37,-72,-30,-70,-18,-76,-14,
  116.                -81,-6,-80,0,-77,7,-75,11,-70,12,
  117.                /* Afrika */
  118.                -6,35,2,36,10,37,10,33,20,31,21,33,32,32,
  119.                36,20,44,11,51,12,50,8,47,3,39,-4,41,-14,
  120.                35,-19,35,-24,33,-26,31,-30,26,-34,19,-34,
  121.                17,-28,15,-23,12,-18,14,-11,13,-5,9,-1,10,4,
  122.                6,4,4,6,-2,5,-8,5,-12,8,-17,15,-16,21,-12,28,
  123.                -10,30,-9,32,-6,35,
  124.                /* Madagaskar */
  125.                49,-12,51,-15,47,-25,43,-25,44,-15,49,-12,
  126.                /* Antarktis */
  127.                -180,-89,-180,-85,-155,-86,-159,-77,-122,-72,
  128.                -100,-74,-100,-72,-75,-73,-70,-66,-55,-63,
  129.                -65,-68,-60,-73,-70,-80,-35,-80,-35,-77,-20,-72,
  130.                0,-70,20,-70,40,-69,53,-66,70,-67,70,-70,
  131.                80,-68,85,-66,100,-66,115,-65,120,-66,135,-65,
  132.                150,-68,166,-70,170,-72,162,-75,160,-82,
  133.                180,-85,180,-89,
  134.                /* Australien */
  135.                142,-11,148,-20,153,-25,153,-32,150,-38,140,-38,
  136.                134,-32,126,-32,119,-34,116,-33,115,-30,114,-25,
  137.                115,-22,121,-20,127,-14,130,-15,130,-11,136,-11,
  138.                135,-15,141,-18,142,-11,
  139.                /* Neuseeland */
  140.                173,-35,178,-38,170,-47,167,-46,
  141.                175,-37,173,-35,
  142.                /* Neuguinea */
  143.                130,0,134,0,136,-2,138,-1,146,-5,150,-10,145,-8,
  144.                143,-10,138,-8,138,-4,132,-3,130,0,
  145.                /* Borneo */
  146.                117,7,119,5,116,-4,110,-4,109,2,117,7,
  147.                /* Sumatra */
  148.                98,5,105,-3,104,-6,95,5,98,5,
  149.                /* Nordamerika */
  150.                -80,25,-81,25,-83,30,-95,30,-98,27,-98,22,
  151.                -95,19,-90,21,-87,21,-89,16,-84,15,-84,10,
  152.                -75,10,-85,10,-95,17,-105,20,-112,32,-117,32,
  153.                -110,23,-117,34,-120,32,-125,40,-125,48,
  154.                -130,54,-140,60,-150,60,-165,55,-158,58,
  155.                -165,62,-160,64,-166,64,-166,66,-160,66,
  156.                -166,68,-156,72,-135,69,-127,70,-110,68,
  157.                -81,70,-81,66,-95,62,-92,57,-83,55,-83,52,
  158.                -79,52,-79,55,-77,57,-78,63,-70,58,-65,60,
  159.                -56,52,-65,50,-62,45,-75,42,-76,36,-81,32,-80,25,
  160.                /* Neufundland */
  161.                -53,47,-59,48,-56,52,-53,47,
  162.                /* Kuba */
  163.                -85,22,-82,23,-75,21,-85,22,
  164.                /* Baffin */
  165.                -66,63,-77,65,-72,68,-89,70,-90,73,-79,73,
  166.                -62,66,-66,63,
  167.                /* Victoria */
  168.                -101,70,-115,70,-120,73,-105,74,-101,70,
  169.                /* Ellismere */
  170.                -80,76,-90,76,-95,82,-70,83,-80,76,
  171.                /* Grönland */
  172.                -45,60,-50,62,-55,70,-60,76,-60,76,-70,78,-40,85,
  173.                -20,80,-22,70,-40,65,-45,60,
  174.                /* Eurasien */
  175.                76,8,72,21,70,20,66,25,55,26,50,30,48,28,
  176.                52,24,56,26,60,22,57,19,52,16,44,12,41,20,
  177.                33,32,34,32,36,37,27,36,27,42,42,42,38,47,
  178.                30,46,29,42,22,40,25,38,22,36,20,40,20,42,
  179.                13,46,12,44,17,40,15,37,12,38,17,39,10,44,
  180.                7,43,3,43,3,41,0,40,0,38,-2,37,-6,36,-7,37,
  181.                -9,37,-9,43,-2,43,-2,46,-4,48,9,54,8,57,
  182.                10,58,14,54,21,55,25,66,21,65,18,62,16,56,
  183.                12,55,10,60,5,57,5,63,20,70,25,71,43,67,
  184.                65,70,70,73,80,72,80,74,105,78,112,76,113,74,
  185.                130,73,130,71,150,72,160,70,175,70,170,66,
  186.                180,65,180,63,170,60,162,60,162,56,157,52,
  187.                156,58,160,60,157,62,155,59,141,59,136,55,
  188.                141,45,140,47,134,43,128,39,129,35,126,35,
  189.                125,40,118,39,121,31,120,26,116,23,109,21,
  190.                105,19,109,16,109,11,105,10,100,14,100,8,
  191.                104,2,100,4,98,8,97,17,94,16,94,20,92,22,
  192.                88,22,80,16,80,10,76,8,
  193.                /* Großbritannien */
  194.                -5,58,-3,58,1,52,-5,50,-5,58,
  195.                /* Irland */
  196.                -7,55,-7,52,-10,52,-10,54,-5,55,
  197.                /* Island */
  198.                -22,67,-15,67,-13,65,-20,64,-22,67,
  199.                /* Japan */
  200.                141,45,145,44,140,35,130,31,130,34,139,38,141,45,
  201.                /* Sri Lanka (Ceylon) */
  202.                80,10,82,8,80,7,80,10
  203.    };
  204.  
  205. int fuelldat[] =              /* Falls der Benutzer die Erdteile als aus-
  206.                                  gefüllte Flächen haben will,wird an den
  207.                                  hier angegebenen Koordinaten ein Füll-
  208.                                  versuch vorgenommen. Da selten ein ganzer
  209.                                  Kontinent auf einmal sichtbar ist,brauche
  210.                                  ich mehrere Füllpunkte pro Erdteil */
  211. {  0,-78,0,-45,-10,-70,-40,   /* Südamerika */
  212.    -10,20,25,-30,40,5,30,25,  /* Afrika */
  213.    46,-20,                    /* Madagaskar */
  214.    0,-75,90,-70,140,-75,-110,-80,   /* Antarktis */
  215.    120,-30,150,-30,133,-15,145,-35, /* Australien */
  216.    176,-39,                   /* Neuseeland */
  217.    141,-7,                    /* Neuguinea */
  218.    115,0,                    /* Borneo */
  219.    -150,65,-70,54,-102,25,-100,40,  /* Nordamerika */
  220.    -45,65,-40,75,             /* Grönland */
  221.    -5,40,20,50,80,20,100,20,160,65,100,70,   /* Eurasien */
  222.    -2,52,                     /* Großbritannien */
  223.    135,35,                    /* Japan */
  224.    -70,65,-80,72,             /* Baffin */
  225.    -109,71,                   /* Victoria */
  226.    -80,80,                    /* Ellismere */
  227. };
  228.  
  229. init()                        /* um keine Zeit mit den andauernden trans-
  230.                                  zendentalen Rechenoperationen zu ver-
  231.                                  schwenden */
  232. {
  233.    int sch;
  234.    printf("Ich initialisiere die Sinus-Cosinus-Tabelle....\n");
  235.    for(sch=0;sch<361;sch++)
  236.    {
  237.       sn[sch] = sin ( ( (double) sch) * PI180);
  238.       cs[sch] = cos ( ( (double) sch) * PI180);
  239.    }
  240. }
  241.  
  242. aufmachen()                   /* Libraries,Screens öffnen */
  243. {
  244.    int i;
  245.  
  246.    if ((IntuitionBase = (struct IntuitionBase *)
  247.       OpenLibrary("intuition.library",0l))==NULL)
  248.       printf("Wo ist denn dieses #!?@§ Intuition ?!!\n"),exit(FALSE);
  249.  
  250.    if ((GfxBase =(struct GfxBase *)
  251.       OpenLibrary("graphics.library",0l))==NULL)
  252.       printf("Wer hat mit meinem Malkasten gemalt ??\n"),exit(FALSE);
  253.  
  254.    if ((ms[0] = OpenScreen(&TheScreen))==NULL)
  255.       exit (FALSE);
  256.  
  257.    if ((ms[1] = OpenScreen(&TheScreen))==NULL)
  258.       CloseScreen(ms[0]),exit(FALSE);
  259.  
  260.    ScreenToBack(ms[0]),ScreenToBack(ms[1]);
  261.  
  262.    for (i=0;i<2;i++)
  263.    {
  264.       vp[i]=&(ms[i]->ViewPort);
  265.       SetRGB4(vp[i],0l,0l,0l,0l);
  266.       SetRGB4(vp[i],1l,15l,15l,15l);
  267.    }
  268. }
  269.  
  270. berechne(l,b)  /* Dies ist die eigentliche Rechenroutine */
  271. int l,b;       /* Werte brauchen nicht zurückgegeben werden */
  272. {
  273. float v,t;
  274.    l=l-drehung;            /* eingestellter Drehwinkel */
  275.    if (l>359) l %=360;     /* Rückführen der Werte in  */
  276.    while (l<0) l +=360;    /* den Bereich 0 bis 359    */
  277.    while (b<0) b +=360;
  278.    x=sn[l]*cs[b];          /* sn für sinus;cs für cosinus */
  279.    v=cs[l]*cs[b];
  280.    t=sn[b];
  281.    y=t*cs[winkel]-v*sn[winkel];
  282.    za=z;
  283.    z=t*sn[winkel]+v*cs[winkel];
  284. }
  285.  
  286. allocate_bitmaps()         /* sämtliche Einzelbilder werden in lauter */
  287. {                          /* Mini-BitMaps gespeichert (immerhin belegt */
  288.    int i,j;                /* eins schon 2.5 KByte,72 Bitmaps also 180KB)! */
  289.                            /* Diese BitMaps werden hier alloquiert und */
  290.    for(j=0;j<MAXBILDER;j++)/* initialisiert */
  291.    {
  292.       InitBitMap(&myBM[j],1l,201l,101l);
  293.       myBM[j].Planes[0]=AllocRaster(201l,101l);
  294.       if (myBM[j].Planes[0]==NULL)  /* kein Speicher mehr frei */
  295.       {
  296.          abbruch:
  297.          for(i=j-1;i>=0;i--)
  298.          {
  299.             FreeRaster(myBM[i].Planes[0],201l,101l);
  300.          }
  301.          CloseScreen(ms[0]);  /* schön saubermachen */
  302.          CloseScreen(ms[1]);
  303.          exit(FALSE);
  304.       }
  305.    }
  306.    myplane=AllocRaster(212l,115l);
  307.    if (myplane==NULL) goto abbruch;
  308. }
  309.  
  310. main()
  311. {
  312.    int i,j,schleife,scrsw,fuellen;
  313.    unsigned int zaehler;
  314.    long brl,brt,inc,inc2,weitermachen=TRUE,xpos,ypos,wink,
  315.    minterm=0x00C0,mask=0x00FF;   /* die zwei bestimmen beim BltBitMap'en
  316.                                     die Art des Kopierens.So,wie sie jetzt
  317.                                     eingestellt sind,heißt das :genaue
  318.                                     Kopie */
  319.    float x1,y1;
  320.  
  321.    aufmachen();
  322.    init();
  323.    allocate_bitmaps();
  324.  
  325.    do {                 /* Dies ist die Hauptschleife.Sie wird mindestens
  326.                          * einmal ausgeführt und beendet bei Eingabe von
  327.                          * -1 (s.u.).Kontroll-Flag :weitermachen          */
  328.       WBenchToFront();
  329.       printf("%c",12);
  330.       printf("                         EARTH-BOING Version 1.4\n");
  331.       printf("                programmiert in Aztec C von Tim Pietzcker\n");
  332.       printf("\n");
  333.       printf("Bitte gib den Neigungswinkel in Grad ein (0-359,normal 23)\n");
  334.       printf("oder -1 zum Beenden :");
  335.       scanf("%d",&winkel);
  336.       if (winkel>359 || winkel<0) weitermachen=FALSE;
  337.       else weitermachen=TRUE;
  338.       if (weitermachen)    /* sonst Schluß */
  339.       {
  340.          printf("Sollen Flächen ausgefüllt werden (1) oder nicht (0) ?");
  341.          scanf("%d",&fuellen);
  342.          TheWindow.Screen=ms[0];
  343.          ScreenToFront(ms[0]);
  344.          if ((MyWindow=OpenWindow(&TheWindow))==NULL) goto ende;
  345.          rp[0]=MyWindow->RPort;
  346.          rp[0]->TmpRas=InitTmpRas(&hilfras,myplane,(long)RASSIZE(212l,115l));
  347.          MyWindowBM[0]=rp[0]->BitMap;
  348.          SetAPen(rp[0],1l);
  349.          SetOPen(rp[0],1l);
  350.          SetBPen(rp[0],1l);
  351.          brl=MyWindow->BorderLeft;
  352.          brt=MyWindow->BorderTop;
  353.  
  354.          for(schleife=0;schleife<=MAXBILDER-1;schleife++) /* Einzelbilder */
  355.          {
  356.             SetRast(rp[0],0l);
  357.             drehung=schleife*(360/MAXBILDER);
  358.             for (j=1,zaehler=1;j<23;j++,zaehler++) /* Kontinente/Inseln
  359.                                                       nacheinander */
  360.             {
  361.                laenge=erddat[zaehler];
  362.                breite=erddat[++zaehler];
  363.                berechne(laenge,breite);
  364.                x1=x;
  365.                y1=y;
  366.                zaehler++;
  367.                for (i=1;i<=datanz[j];i++,zaehler++) /* einzelne Punkte */
  368.                {
  369.                   laenge=erddat[zaehler];
  370.                   breite=erddat[++zaehler];
  371.                   berechne(laenge,breite);
  372.                   if (z>=0 && za>=0)      /* Hidden Lines */
  373.                   {
  374.                      Move(rp[0],(long)(100*x1+100),(long)(-50*y1+50));
  375.                      Draw(rp[0],(long)(100*x+100),(long)(-50*y+50));
  376.                   }
  377.                   x1=x;
  378.                   y1=y;
  379.                }
  380.                zaehler--; /* um 1 zu hoch gezählt */
  381.             }
  382.             DrawEllipse(rp[0],100l,50l,100l,50l);
  383.             if (fuellen==1)
  384.             {
  385.                DrawEllipse(rp[0],100l,50l,99l,50l);
  386.                DrawEllipse(rp[0],100l,50l,101l,51l);  /* Dies ist als
  387.                                                          "Auslaufschutz"
  388.                                                          gedacht (hat nichts
  389.                                                          mit PAMPERS zu tun)
  390.                                                       */
  391.                for(i=1;i<=74;i+=2)
  392.                {
  393.                   laenge=fuelldat[i];
  394.                   breite=fuelldat[i+1];
  395.                   berechne(laenge,breite);
  396.                   if (z>0)
  397.                      Flood(rp[0],0l,(long)(100*x+100),(long)(-50*y+50));
  398.                }
  399.                SetAPen(rp[0],0l);
  400.  
  401.                DrawEllipse(rp[0],100l,50l,101l,51l);
  402.                SetAPen(rp[0],1l);
  403.             }
  404.             BltBitMap(MyWindowBM[0],brl,brt,
  405.              &myBM[schleife],0l,0l,201l,101l,
  406.              minterm,mask,NULL);
  407.             /* So,dieser gigantische Befehl schneidet ein Stück aus der
  408.                BitMap von meinem Window und klebt die Kopie in eine der
  409.                36 Mini-BitMaps */
  410.          }
  411.          CloseWindow(MyWindow);
  412.          /* Jetzt haben wir alle Drehungen in lauter kleinen Bitmaps
  413.             abgelegt und können die nun für unsere Animation verwenden */
  414.          TheWindow2.Screen=ms[0];
  415.          if ((mw[0]=OpenWindow(&TheWindow2))==NULL) goto ende;
  416.          TheWindow2.Screen=ms[1];
  417.          if ((mw[1]=OpenWindow(&TheWindow2))==NULL)
  418.          {
  419.             CloseWindow(mw[0]);
  420.             goto ende;
  421.          }
  422.          rp[0]=mw[0]->RPort;
  423.          MyWindowBM[0]=rp[0]->BitMap;
  424.          rp[1]=mw[1]->RPort;
  425.          MyWindowBM[1]=rp[1]->BitMap;
  426.          inc=4,inc2=3,j=0;
  427.          xpos=0;
  428.          wink=270;
  429.          ypos=86+87*sn[wink];
  430.          scrsw=1;
  431.  
  432.          while ((msg=GetMsg(mw[0]->UserPort))==NULL) /* weiter,solange noch
  433.                                                         kein Event = Maus-
  434.                                                         klick aufgetreten */
  435.          {
  436.             scrsw=1-scrsw;
  437.             ScreenToFront(ms[scrsw]);        /* Page Flip ! */
  438.  
  439.             SetRast(rp[1-scrsw],0l);
  440.             xpos+=inc;                       /* Position des nächsten Bildes
  441.                                                 berechnen (invertierte nega-
  442.                                                 tive Sinuskurve) ...*/
  443.             if (xpos>430 || xpos<0) xpos-=inc,inc=-inc;
  444.             wink+=inc2;
  445.             if (wink>360 || wink<180) wink-=inc2,inc2=-inc2;
  446.             ypos=86+87*sn[wink];
  447.             if (winkel <180) j+=inc/4; else j-=inc/4;
  448.             if (j==MAXBILDER) j=0;
  449.             if (j==-1) j=MAXBILDER-1;
  450.             BltBitMap(&myBM[j],0l,0l,MyWindowBM[1-scrsw],
  451.              xpos+brl,ypos+brt,
  452.              201l,101l,minterm,
  453.              mask,NULL );
  454.             /* ... und die BitMap wieder zurückkopieren ... */
  455.  
  456.          }
  457.          ReplyMsg(msg);            /* Mausklick-Message beantworten */
  458.          CloseWindow(mw[0]),CloseWindow(mw[1]); /* und aufräumen */
  459.       }
  460.  
  461.    } while (weitermachen);
  462.    ende:
  463.    if (myplane) FreeRaster(myplane,212l,115l);
  464.    for (i=0;i<MAXBILDER;i++) FreeRaster(myBM[i].Planes[0],201l,101l);
  465.    /* raus mit dem Ballast */
  466.    CloseScreen(ms[0]),CloseScreen(ms[1]);
  467.    CloseLibrary(GfxBase);
  468.    CloseLibrary(IntuitionBase);
  469. }
  470.  
  471. /* total fertig */
  472.